<?php

/**
 * cita actions.
 *
 * @package    fisio-ud
 * @subpackage cita
 * @author     Johan AR <j3valentin@gmail.com>
 */
class citaActions extends sfActions {

  public function executeIndex(sfWebRequest $request) {
    $this->SCitas = SCitaQuery::create()->find();
  }

  public function executeShow(sfWebRequest $request) {
//    $this->SCita = SCitaPeer::retrieveByPk($request->getParameter('id'));
    $this->SCita = SCitaQuery::create()
            ->joinWith('SCita.Sede')
//            ->joinWith('SCita.UsuarioRelatedByProfesionalId')
//            ->joinWith('UsuarioRelatedByProfesionalId.Persona')
//            ->joinWith('UsuarioRelatedByProfesionalId.sfGuardUser')
            ->joinWith('SCita.UsuarioRelatedByPacienteId')
            ->joinWith('UsuarioRelatedByPacienteId.Persona')
//            ->joinWith('UsuarioRelatedByPacienteId.sfGuardUser')
            ->findPk($request->getParameter('id'));
    $this->forward404Unless($this->SCita);
    $this->SCita->getUsuarioRelatedByPacienteId();
  }

  public function executeNew(sfWebRequest $request) {
    if ($request->hasParameter('inicio')) {
      $this->form = new SCitaForm($this->initSCita($request));
    }
  }

  public function executeCreate(sfWebRequest $request) {
    $this->forward404Unless($request->isMethod(sfRequest::POST));

    $this->form = new SCitaForm($this->initSCita($request));

    $this->processForm($request, $this->form);

    $this->setTemplate('new');
  }

  public function executeEdit(sfWebRequest $request) {
    $SCita = SCitaQuery::create()->findPk($request->getParameter('id'));
    $this->forward404Unless($SCita, sprintf('Object SCita does not exist (%s).', $request->getParameter('id')));
    $this->Paciente = $SCita->getUsuarioRelatedByPacienteId();
    $SCita->getUsuarioRelatedByProfesionalId();
    $this->form = new SCitaForm($SCita);
  }

  public function executeUpdate(sfWebRequest $request) {
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $SCita = SCitaQuery::create()->findPk($request->getParameter('id'));
    $this->forward404Unless($SCita, sprintf('Object SCita does not exist (%s).', $request->getParameter('id')));
    $this->form = new SCitaForm($SCita);

    $this->processForm($request, $this->form);

    $this->setTemplate('edit');
  }

  public function executeDelete(sfWebRequest $request) {
    $request->checkCSRFProtection();

    $SCita = SCitaQuery::create()->findPk($request->getParameter('id'));
    $this->forward404Unless($SCita, sprintf('Esta cita no existe (%s).', $request->getParameter('id')));
    $SCita->delete();

    $this->redirect('cita/index');
  }

  protected function processForm(sfWebRequest $request, sfForm $form) {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid()) {
      $SCita = $form->save();
      $AgendaProfesional = SProfesionalAgendaQuery::create()
              ->filterByTabla('cita')
              ->filterByTablaId($SCita->getId())
              ->findOne();
      if (!$AgendaProfesional) {
        $AgendaProfesional = new SProfesionalAgenda();
      }
      $AgendaProfesional->setUsuario($this->getUser()->getProfile());
      $AgendaProfesional->setTabla('cita');
      $AgendaProfesional->setTablaId($SCita->getId());
      $AgendaProfesional->setInicio($SCita->getFechaHora());
      $CitaFin = mktime(date('H', strtotime($SCita->getFechaHora())), date('i', strtotime($SCita->getFechaHora())) + $SCita->getDuracion(), 0, date('m', strtotime($SCita->getFechaHora())), date('d', strtotime($SCita->getFechaHora())));
      $AgendaProfesional->setFin($CitaFin);
      $AgendaProfesional->save();

      $this->getUser()->setFlash('notice', 'Se ha guadado la Cita con exito.');

      $this->redirect('agenda/index');
    }
  }

  public function executePaciente(sfWebRequest $request) {
    $this->forward404Unless($request->isMethod(sfRequest::POST));

    $this->Paciente = UsuarioQuery::create()
            ->joinWith('Usuario.Persona')
            ->usesfGuardUserQuery()
            ->filterByUsername($request->getParameter('c'))
            ->endUse()
            ->findOne();
  }

  private function initSCita(sfWebRequest $request) {
    $Cita = new SCita();
    $Cita->setProfesionalId($this->getUser()->getProfile()->getId());
    $Cita->setFechaHora($request->getParameter('inicio'));
    $dia = date('w', $request->getParameter('inicio'));

    $criteria = new Criteria();
    $criteria->add(FtUsuarioAsistenciaPeer::USUARIO_ID, $Cita->getProfesionalId());
    $criteria->add(FtUsuarioAsistenciaPeer::DIA_ID, $dia);
    $criteria->addOr(FtUsuarioAsistenciaPeer::DIA_ID, 0);
    $criteria->addDescendingOrderByColumn(FtUsuarioAsistenciaPeer::DIA_ID);
    $FtUsuarioAsistencias = FtUsuarioAsistenciaPeer::doSelectJoinSede($criteria);

    if (count($FtUsuarioAsistencias)) {
      foreach ($FtUsuarioAsistencias as $FtUsuarioAsistencia) {
        $Cita->setSede($FtUsuarioAsistencia->getSede());
        break;
      }
    }

    if ($request->hasParameter('fin')) {
      $durations = SCitaPeer::getDurations();
      $Cita->setDuracion($durations[60 - (date('i', $request->getParameter('inicio') - $request->getParameter('fin')))]);
    }

    $Cita->setEstado(0);

    //    if ($request->isMethod('post')) {
    if ($request->hasParameter('codigo')) {
      $codigo = $request->getParameter('codigo');
      $c = new Criteria();
      $c->addJoin(sfGuardUserPeer::ID, UsuarioPeer::SF_GUARD_USER_ID);
      $c->add(sfGuardUserPeer::USERNAME, $codigo);
      $Pacientes = UsuarioPeer::doSelectJoinAll($c);

      if (count($Pacientes))
        $Cita->setUsuarioRelatedByPacienteId($Pacientes[0]);
    }

    return $Cita;
  }

}